package org.monster.context.core.response;

import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.monster.context.core.Constants;
import org.monster.context.core.parameter.HttpResponse;
import org.monster.context.core.request.HttpRequest;
import org.monster.context.exception.MimeNotFoundException;
import org.monster.context.reader.MimeReader;
import org.monster.context.reader.XmlReader;
import org.monster.context.reader.tag.MimeTag;
import org.monster.context.util.URIUtils;

import java.io.File;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 响应多媒体互联网格式
 *
 * @author Monster
 */
public class ResponseMime {

    /**
     * 日志器
     */
    private static final Logger logger = Logger.getLogger(ResponseMime.class.getName());
    /**
     * xml阅读器
     */
    private final XmlReader<MimeTag> reader = new MimeReader();

    /**
     * 构造方法
     */
    public ResponseMime() {
        super();
    }

    /**
     * 查找 多媒体互联网格式
     * 使用request，和response查找mime
     *
     * @param request  请求
     * @param response 响应
     * @return 多媒体互联网格式
     */
    public String findMime(HttpRequest request, HttpResponse response) {
        List<MimeTag> mimeTags = getMimeTagList();
        String requestURI = request.getRequestURI();
        String suffix = URIUtils.endsWithURI(requestURI, "\u002e"); // --> .
        MimeTag tag = null;
        try {
            tag = getMimeTagList(mimeTags, suffix);
        } catch (MimeNotFoundException ex) {
            logger.log(Level.SEVERE, null, ex);
        }
        if (requestURI != null && tag != null) {
            String ext = tag.getExtension();
            setResponse(response, ext, tag.getMimeType());
            return ext;
        }
        return null;
    }

    /**
     * 查找 多媒体互联网格式
     * 使用uri查找Mime
     *
     * @param uri uri
     * @return 多媒体互联网格式
     */
    public String findMime(String uri) {
        List<MimeTag> mimeTags = getMimeTagList();
        String suffix = uri.substring(uri.indexOf('.') + 1,
                uri.length());
        MimeTag tag = null;
        try {
            tag = getMimeTagList(mimeTags, suffix);
        } catch (MimeNotFoundException ex) {
            logger.log(Level.SEVERE, null, ex);
        }
        if (tag != null) {
            return tag.getMimeType();
        }
        return null;
    }

    /**
     * 获取 多媒体互联网格式标签 集合
     * 获取遍历后的MImeTag
     *
     * @return 多媒体互联网格式标签 集合
     */
    private List<MimeTag> getMimeTagList() {
        Element element = null;
        try {
            element = reader.getRootElement(new File(Constants.MIME_PATH));
        } catch (DocumentException ex) {
            logger.log(Level.SEVERE, null, ex);
        }
        reader.resolveElement(element);
        List<MimeTag> mimeTags = reader.getTags();
        return mimeTags;
    }

    /**
     * 获取 多媒体互联网格式标签 集合
     * 获取匹配URI的MimeTag
     *
     * @param mimeTags 多媒体互联网格式标签
     * @param suffix   后缀
     * @return 多媒体互联网格式标签
     * @throws MimeNotFoundException 多媒体互联网格式未找到异常
     */
    private MimeTag getMimeTagList(List<MimeTag> mimeTags, String suffix)
            throws MimeNotFoundException {
        for (MimeTag xmlMime : mimeTags) {
            if (xmlMime.getExtension().equals(suffix)) {
                return xmlMime;
            }
        }
        return null;
    }

    /**
     * 设置响应
     * 填充HttpResponse信息
     *
     * @param response 响应
     * @param ext      扩展
     * @param type     类型
     */
    private void setResponse(HttpResponse response, String ext, String type) {
        response.setContentType(type);
        response.setMime(ext);
    }
}
